Sed 命令或者说流编辑器是Linux/Unix系统提供的强力工具. 她主要用于文本替代, 查找并替换.但它也能做其他的文本维护工作,比如插入,删除,搜索等. 使用SED, 我们做到不用打开文件就完成编辑操作. Sed 还支持正则表达式, 这使得 sed 还成为一款强大的测试工具.
本文中, 我们将会通过一些例子学习使用 SED 命令. 使用sed命令的基本语法为,
sed OPTIONS… [SCRIPT] [INPUTFILE…]
现在让我们看看一些例子.
- 例1) 显示文件部分内容
sed可以让你只查看文件的一部分内容. 使用下面命令来查看指定行的内容,
[linuxtechi@localhost ~]$ sed -n 22,29p testfile.txt
这里, 选项 ‘n’ 抑制输出所有文件的内容,而命令 ‘p’ 会只输出22行到20行的内容.
- 例2) 除了某些行外,显示所有内容
使用下面命令可以输出除了指定行外的所有内容,
[linuxtechi@localhost ~]$ sed 22,29d testfile.txt
命令 ‘d’ 会将指定行从输出中删除.
- 例3) 从第N行开始,每3行显示一行内容
要从第2行开始,显示每3行的内容,使用下面命令
[linuxtechi@localhost ~]$ sed -n '2-3p' file.txt
- 例4) 删除一行
使用下面命令删除一行, use the following command,
[linuxtechi@localhost ~]$ sed Nd testfile.txt
这里 ‘N’ 为行好而 ‘d’ 命令删除指定行. 要删除最后一样,则可以这样
[linuxtechi@localhost ~]$ sed $d testfile.txt
- 例5) 删除连续的几行
要删除连续几行的内容,运行
[linuxtechi@localhost ~]$ sed '29-34d' testfile.txt
这会删除 testfile.txt 中的第29到34行的内容.txt file.
- 例6) 只保留指定范围的内容
要删除除了指定行之外的所有内容,使用 ‘!’
[linuxtechi@localhost ~]$ sed '29-34!d' testfile.txt
这里 ‘!’ 命令的意思是
非
, 它会反转条件,即不要删除指定的行. 所有行,除了 29-34 行会从文件 testfile.txt 中删掉. - 例7) 增加空行/空格
要在每个非空行后添加一个空行, 使用选项 ‘G’,
[linuxtechi@localhost ~]$ sed G testfile.txt
- 例8) 搜索并替换字符串
可以这样搜索并替换字符串,
[linuxtechi@localhost ~]$ sed 's/danger/safety/' testfile.txt
这里命令 ‘s’ 会搜索每行中第一个单词 ‘danger’ 然后将之替换为 ‘safety’.
- 例9) 全文搜索并替换字符串
要全部替换文件中的单词,我们可以将命令 ‘g’ 与 ‘s’ 连用
[linuxtechi@localhost ~]$ sed 's/danger/safety/g' testfile.txt
- 例10) 替换第n次出现的字符串模式
我们可以只替换第n次出现的字符串. 比如将第二次淑贤的 ‘safety’ 替换为 ‘danger’,
[linuxtechi@localhost ~]$ sed ‘s/danger/safety/2’ testfile.txt
将每行中的第二次出现的‘danger’替换掉,
[linuxtechi@localhost ~]$ sed 's/danger/safety/2g' testfile.txt
- 例11) 只替换指定行上的字符串
只替换指定行上的字符串, 这样做
[linuxtechi@localhost ~]$ sed '4 s/danger/safety/' testfile.txt
这只会在第四行上做替换. 你也可以指定一系列的行,
[linuxtechi@localhost ~]$ sed '4-9 s/danger/safety/' testfile.txt
- 例12) 在匹配搜索的后面/前面添加一行
在匹配位置的后面添加一行内容, 使用命令 ‘a’ ,
[linuxtechi@localhost ~]$ sed '/danger/a "This is new line with text after match"' testfile.txt
在匹配位置的前面添加一行内容, 使用命令 ‘i’,
[linuxtechi@localhost ~]$ sed '/danger/i "This is new line with text before match" ' testfile.txt
- Example :13) 修改匹配行的整个内容
修改匹配行的整个内容使用命令 ‘c’,
[linuxtechi@localhost ~]$ sed '/danger/c "This will be the new line" ' testfile.txt
这样若某行中包含 ‘danger’, 则整行内容都会改变.
到目前为止,我们还只是用到了sed的简单表达式,现在我们来看看sed的更高级用法,这些用法往往会用到正则表达式.
- 例14) 运行多条sed命令
若要运行多条sed表达式, 使用命令 ‘e’ 来将多个sed命令串起来,
[linuxtechi@localhost ~]$ sed -e 's/danger/safety/g' -e 's/hate/love/' testfile.txt
- 例15) 修改文件前做个备份
使用选项‘-i.bak’来在修改文件前创建备份,
[linuxtechi@localhost ~]$ sed -i.bak -e 's/danger/safety/g' testfile.txt
这回创建一个以 .bak
为后缀的备份文件. 当然你也可以选择其他喜欢的扩展名.
- 例16) 删除以指定模式开头并且以指定模式结尾的行
删除以指定模式开头并且以指定模式结尾的行,使用以下命令
[linuxtechi@localhost ~]$ sed -e 's/danger.*stops//g' testfile.txt
这回删除以‘danger’开头且以‘stops’结尾的行,‘.*’ 表示中间可以有任意多个单词.
- 例17) 在行中添加内容
使用sed和正则表达式在每行前面添加内容
[linuxtechi@localhost ~]$ sed -e 's/.*/testing sed &/' testfile.txt
现在每一行前面都加上 ‘testing sed’ 了.
- 例18) 删除所有注释行以及空行
删除所有注释的行(以#开头的行)以及空行,
[linuxtechi@localhost ~]$ sed -e 's/#.*//;/^$/d' testfile.txt
之想删除注释行的话
[linuxtechi@localhost ~]$ sed -e 's/#.*//' testfile.txt
- 例19) 从
/etc/passwd
中抽取出所有的用户名列表用下面命令可以从
/etc/passwd
中抽取出所有的用户名列表[linuxtechi@localhost ~]$ sed 's/\([^:]*\).*/\1/' /etc/passwd
所有用户的列表都会显示在屏幕上.
- 例20) 防止使用sed时覆写了系统链接
‘sed -i’ 命令会删除系链接接并且创建一个常规的文件替代这个链接. 为了防止 ‘sed -i‘ 破坏这个链接, 执行sed时你还需要使用 ‘–follow-symklinks‘ 参数.
假设我想金庸 CentOS 或 RHEL 服务器上的 SELinux,可以这样
[linuxtechi@localhost ~]# sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux